
#ifndef FILEOPERATION_H
#define FILEOPERATION_H

namespace Pan
{

    /**
     * @brief 包含常用的文件操作的类库
     */
    class FileOperation
    {

    public:
        /**
         * @brief 判断指定路径表示的文件或目录是否存在
         * @param path 路径
         * @return 路径是否存在
         */
        static bool is_existing_path(const wchar_t *path);

    public:
        /**
         * @brief 判断给定的路径是否一个存在的目录
         * @param path 指定的路径
         * @return 是不是一个存在的目录
         */
        static bool is_existing_directory(const wchar_t *path);

    public:
        /**
         * @brief 判断一个目录是否为空目录，不存在任何文件和子目录
         * @param path 目录的路径
         * @return 可以确定目录为空目录时返回true，不为空目录或无法确定返回false。
         */
        static bool is_empty_directory(const wchar_t *path);

    public:
        /**
         * @brief 判断指定的路径是否为存在的文件（不是文件夹）
         * @param path 路径字符串
         * @return 存在返回true，不存在返回false。
         */
        static bool is_existing_file(const wchar_t *path);

    public:
        /**
         * @brief 复制文件，目标文件存在时会对其进行覆盖。
         * @param src_path 源文件路径
         * @param dest_path 目标文件路径
         * @return 复制成功返回true，失败返回false。
         */
        static bool copy_file(const wchar_t *src_path, const wchar_t *dest_path);

    public:
        /**
         * @brief 删除文件(不是文件夹)
         * @param filepath
         * @return 删除成功返回true，失败返回false。
         */
        static bool delete_file(const wchar_t *filepath);

    public:
        /**
         * @brief 获取指定文件的大小
         * @param filepath 文件的路径
         * @param pok bool指针，保存是否操作成功
         * @return
         */
        static unsigned long long get_file_size(const wchar_t *filepath, bool *pok = nullptr);

    public:
        /**
         * @brief 创建文件夹
         * @param path 文件夹路径
         * @return 创建成功返回true，失败返回false。
         */
        static bool create_directory(const wchar_t *path);

    public:
        /**
         * @brief 创建指定的路径
         * @param path 路径字符串
         * @return 最后指定路径存在返回true，不存在返回false。
         */
        static bool create_directories(const wchar_t *path);

    public:
        /**
         * @brief 获取文件最近的修改时间
         * @param filepath 文件路径
         * @param ptime 保存文件修改时间的变量的指针，
         *  不能是空指针，否则参数错误。
         * @return 获取成功返回true，失败返回false。
         */
        static bool get_file_last_write_time //
            (const wchar_t *filepath, unsigned long long *ptime);
    };

} // namespace Pan

#endif
